/**
  ******************************************************************************
  * @file        
  * @author      古么宁
  * @brief       iec101 规约系统层文件，进行系统的一些基本的定义
  * @brief       IEC10x 文件传输相关部分
  * @note        此文件提供 linux 平台下的文件操作接口，如需移植
  *              需要用户实现以下接口
  * @date        2019-11-27
  ******************************************************************************
  *
  * COPYRIGHT(c) 2019 GoodMorning
  *
  ******************************************************************************
  */
#ifndef __IEC_FILE_
#define __IEC_FILE_

// 必须依赖项
#include "iec_list.h"
#include "CPxTime2a.h"


/* 以下为 linux 下的文件示例 */
#include <sys/types.h>
#include <dirent.h>

/* 移植项，以下结构体内容根据实际情况做响应的改动 */

/// 文件夹内容结构体
typedef struct {
	DIR * fd;
	char  path[256];
}
iec_dir_t;

/// 文件内容结构体，
typedef struct {
	int fd ;
} 
iec_file_t ;


/**
  * @author   古么宁
  * @brief    iec 打开文件夹
  * @param    dirname  : 目标文件夹名称
  * @return   成功返回打开文件夹的句柄，否则返回 NULL
*/
iec_dir_t * iec_opendir(const char * dirname) ;

/**
  * @author   古么宁
  * @brief    iec 关闭文件夹
  * @param    dir   : 目标文件夹句柄
  * @return   
*/
int iec_closedir(iec_dir_t * dir) ; 


/**
  * @author   古么宁
  * @brief    iec 读取一次文件夹内容
  * @param    dir      : 已打开的文件夹
  * @param    filename : 当前次读取到的文件名
  * @param    filetime : 文件最后修改时间
  * @note     在实现上需要支持多次读取依次返回文件列表，如 while(iec_readdir(...) > 0)
  * @return   成功返回文件大小，返回 -1 表示已结束读取
*/
int iec_readdir(iec_dir_t *dir , char * filename , struct CP56Time2a * filetime) ;


/**
  * @author   古么宁
  * @brief    iec 获取文件大小
  * @param    dir      : 指定读取文件夹
  * @param    file     : 文件名
  * @return   成功返回文件读取长度，错误返回小于 0
*/
int iec_fsize(const char * dir , const char * file);


/**
  * @author   古么宁
  * @brief    iec 打开一个文件
  * @param    dir      : 指定读取文件夹
  * @param    file     : 文件名
  * @param    mode     : 'r' or 'w' : read/write
  * @note     'w':尽可能做到文件夹不存在则创建文件夹，文件不存在也创建
  * @return   成功返回文件句柄
*/
iec_file_t * iec_fopen(const char * dir , const  char * file , int mode);



/**
  * @author   古么宁
  * @brief    iec 读取文件内容
  * @param    iecfile  : 已打开的文件句柄
  * @param    ptr      : 文件内存
  * @param    size     : 当前次读取大小
  * @note     在实现上需要支持多次读取依次返回文件数据，
  *           如 while(iec_fread(...) > 0) 依次读取所有数据
  * @return   成功返回文件读取长度，错误返回小于 0
*/
int iec_fread(iec_file_t *iecfile, void * ptr , size_t size) ;

/**
  * @author   古么宁
  * @brief    iec 写入文件内容
  * @param    iecfile  : 已打开的文件句柄
  * @param    ptr      : 文件内存
  * @param    size     : 当前次读取大小
  * @note     在实现上需要支持多次追尾写入，
  *           在不 iec_fclose() 的情况下写入不能覆盖前面的内容
  * @return   成功返回文件读取长度，错误返回小于 0
*/
int iec_fwrite(iec_file_t *iecfile, void * ptr , size_t size);

/**
  * @author   古么宁
  * @brief    iec 关闭文件
  * @param    iecfile  : 已打开的文件句柄
  * @return   成功返回 0
*/
int iec_fclose(iec_file_t *iecfile) ;

#endif
